package com.atguigu.singleton.type5;

/**
 * @program: design-patterns
 * @author: yangshen
 * @description: type3 - 懒汉式3（线程不安全，同步代码块）
 * 优缺点说明：
 * 1) 这种方式，本意是想对第四种实现方式的改进，因为前面同步方法效率太低，改为同步产生实例化的的代码块
 * 2) 但是这种同步并不能起到线程同步的作用。跟第3种实现方式遇到的情形一致，假如一个线程进入了if (singleton == null)判断语句块，还未来得及往下执行，
 *          另一个线程也通过了这个判断语句，这时便会产生多个实例
 * 3) 结论：在实际开发中，不能使用这种方式
 * @create: 2022-01-16 11:28
 **/
public class SingleTon {

    public static void main(String[] args) {
        System.out.println("懒汉式3 - 线程不安全，同步代码块");
        //测试
        SingleTon instance1 = SingleTon.getInstance();
        SingleTon instance2 = SingleTon.getInstance();
        //true
        System.out.println(instance1 == instance2);
        System.out.println("instance1.hashCode() = "+ instance1.hashCode());
        System.out.println("instance2.hashCode() = "+ instance2.hashCode());
    }

    /**
     * 1.构造器私有化，外部不能new
     */
    private SingleTon() {
    }

    /**
     * 2.定义对象实例
     */
    private static SingleTon SINGLE_TON ;

    /**
     * 3.提供一个静态的公有方法，先判断是否存在，再加入同步处理的代码，但是存在线程安全问题
     * @return 该对象实例
     */
    public static SingleTon getInstance(){
        if (null == SINGLE_TON){
            //3.1当同时有两个线程跑到这，当第一个线程创建对象后，第二个线程仍然会创建第二个对象，单例失败
            synchronized (SingleTon.class){
                SINGLE_TON = new SingleTon();
            }
        }
        return SINGLE_TON;
    }
}
